查看原文
其他

几个不错的代码瘦身优化案例

SpringForAll 2022-09-05
关注我,回复关键字“spring”
免费领取Spring学习资料

史蒂夫.乔布斯说,”复杂的终极境界是简单“,同样的优雅的代码一定是精简明了,可读性好。

使用LocalDate和LocalDateTime

LocalDate精确到日期,LocalDateTime精确到时分秒。优化前14行代码

  1. try {

  2.    SimpleDateFormat sdfDay = new SimpleDateFormat("yyyy-MM-dd");

  3.    SimpleDateFormat sdfMins = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

  4.    Date now = new Date();

  5.    String today = sdfDay.format(now);

  6.    String waterStart = today + " 03:00:00";

  7.    String waterEnd = today + " 04:00:00";

  8.    Date waterStartTime = sdfMins.parse(waterStart);

  9.    Date waterEndTime = sdfMins.parse(waterEnd);

  10. } catch (ParseException pe) {

  11.    return XX;

  12. }

优化后3行代码

  1. LocalDateTime now = LocalDateTime.now();

  2. LocalDateTime waterStart = LocalDateTime.of(now.getYear(), now.getMonth(),now.getDayOfMonth(),3,0);

  3. LocalDateTime waterEndTime =LocalDateTime.of(now.getYear(), now.getMonth(),now.getDayOfMonth(),4,0);

默认值使用Optional

优化前五行

  1. if (null == status) {

  2.    param.put("status", new ArrayList<String>());

  3. } else {

  4.    param.put("status", status);

  5. }

优化后一行,使用JDK8的Optional

  1. Optional.ofNullable(status).orElse(new ArrayList<String>());

如果是字符串可以用

  1. StringUtils.defaultIfEmpty(status,"")

字符串累加

字符串只要不在for循环里累加,可以直接用+号,因为编译成字节码后会变成StringBuilder,如果在for循环里面用+号会生成多个StringBuilder,所以在for循环里累加最好在循环外创建StringBuilder。优化前五行

  1. StringBuffer sblog = new StringBuffer();

  2. sblog.append("waterDriven|sellerId=");

  3. sblog.append(request.getSellerTaobaoId());

  4. sblog.append("|result=");

  5. sblog.append(isSuccess);

优化后一行

  1. String sblog="waterDriven|sellerId="+request.getSellerTaobaoId()+"|result="+isSuccess;

以上场景用逗号和等号连接数据,使用GUAVA的Joiner更精简,可读性更好

  1. String sblog=Joiner.on("|").withKeyValueSeparator("=").join(ImmutableMap.of("sellerId", request.getSellerTaobaoId(), "result", isSuccess))

LIST TO MAP

优化前4行

  1. Map<String, String> AssetsMetaIdMap = Maps.newHashMap();

  2. for (AssetsInfoBO assetsInfoBO : request.getAssetsCollectionList()) {

  3.    AssetsMetaIdMap.put(assetsInfoBO.getAssetMetadataId(), assetsInfoBO.getAssetMetadataId());

  4. }

优化后1行

  1. Map<String, String> AssetsMetaIdMap = request.getAssetsCollectionList().stream().collect(Collectors.toMap(Hosting::getAssetMetadataId, Hosting::getAssetMetadataId));

如果key重复会抛出异常

  1. Exception in thread "main" java.lang.IllegalStateException: Duplicate key 80000

减少不需要的判断

优化前5行

  1. String requestId = null;

  2. if (null != request.getExtData()) {

  3.    requestId = request.getExtDataValue(REQUEST_ID_KEY);

  4. }

  5. return requestId;

优化后1行

  1. return request.getExtDataValue(REQUEST_ID_KEY);

去掉else

优化前5行

  1. if (null != result &amp;&amp; StringUtils.isNotBlank(no)) {

  2.     return no;

  3. } else {

  4.     throw new RuntimeException("XX");

  5. }

优化后4行

  1. if (null != result &amp;&amp; StringUtils.isNotBlank(no)) {

  2.     return no;

  3. }

  4. throw new RuntimeException("XX");

不要返回布尔

优化前5行

  1. if ("true".equalsIgnoreCase(value.toString())) {

  2.    invoke = true;

  3. } else {

  4.    invoke = false;

  5. }

优化后一行

  1. invoke = "true".equalsIgnoreCase(value.toString());

使用级联

优化前5行

  1. ParamBO paramBO = new ParamBO();

  2. paramBO.setId(1);

  3. paramBO.setName(”ifeve“);

  4. paramBO.setOld(7);

优化后1行

  1. new ParamBO().withId(1).withName("ifeve").withOld(7);




END



Spring Boot + WebSocket 实时监控异常
为什么要前后端分离?规范如何制定?
推荐一个好看的IDEA主题和图标集
Spring Boot 使用 Disruptor 做内部高性能消息队列
为什么不建议使用ON DUPLICATE KEY UPDATE?

关注后端面试那些事,回复【2022面经】

获取最新大厂Java面经


最后重要提示:高质量的技术交流群,限时免费开放,今年抱团最重要。想进群的,关注SpringForAll社区,回复关键词:加群,拉你进群。

点击“阅读原文”领取2022大厂面经
↓↓↓ 

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存